package JaggSoft.Utilidades;

import java.io.*;
import java.sql.*;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import javax.swing.*;

public class Conexion {
    public static String ID;
    public static Util.Tipo tipo;
    public static boolean bitacora;
    /**
     *Obtiene un JTable con los datos que se le proporcione en la consulta.
     * 
     * @param consulta la consulta con la cuál se cargara la tabla.
     * @param columnas el título de las columnas de la tabla.
     * @return JTable con los datos de la consulta.
     */
    public static JTable ObtenerTabla(String consulta,String columnas[]){
        MyModeloTabla modelo=new MyModeloTabla(columnas);
        JTable tabla=new JTable(modelo);
        Object fila[]=new Object[columnas.length];
        Connection con=null;
        Statement comando=null;
        try {
            con = GetConexion();
            comando = con.createStatement();
            try (ResultSet rs = comando.executeQuery(consulta)) {
                while(rs.next()){
                    for(int i=0;i<columnas.length;i++)
                        fila[i]=rs.getObject(i+1);
                    modelo.AgregarFila(fila);
                }
            }
            comando.close();
            con.close();
        } catch (ClassNotFoundException ex) {
            JOptionPane.showMessageDialog(null,"Error al crear la conexión con el gestor de base de datos, comuniquese con los programadores para solucionar el problema.","Error al Conectarse a la base de Datos",JOptionPane.ERROR_MESSAGE);
        } catch (SQLException ex) {
            JOptionPane.showMessageDialog(null,"Error al consultar al gestor de base de datos, comuniquese con los programadores para solucionar el problema.","Error al Conectarse a la base de Datos",JOptionPane.ERROR_MESSAGE);
        } 
        return tabla;
    }
    /**
     *Obtiene el objeto de Conexión para MySQL.
     * 
     * @return El objeto Connection para conexión a base de datos con MySQL.
     * @throws ClassNotFoundException si no encuentra la clase del driver para la conexión, ya sea porque las librerias no estan incluidas en el proyecto o se hallan perdido.
     * @throws SQLException si la cadena de conexión no tiene los parametros correctos.
     */
    public static Connection GetConexion() throws ClassNotFoundException, SQLException {
        Class.forName("com.mysql.jdbc.Driver");
        return DriverManager.getConnection("jdbc:mysql://localhost/jaggsoft_stockmanager","root","123");
    }
    /**
     *Ejecuta una Consulta ya sea del tipo INSERT, DELETE o UPDATE.
     * 
     * @param consulta la consulta a ser ejecutada en la base de datos.
     * @return true si la consulta se realizo correctamente, false de lo contrario.
     */
    public static boolean EjecutarConsulta(String consulta){
        Connection con=null;
        Statement comando=null;
        boolean estado = false;
        try {
            con = GetConexion();
            comando = con.createStatement();
            comando.executeUpdate(consulta);
            comando.close();
            con.close();
            estado=true;
        } catch (ClassNotFoundException ex) {
            JOptionPane.showMessageDialog(null,"Error al crear la conexión con el gestor de base de datos, comuniquese con los programadores para solucionar el problema.","Error al Conectarse a la base de Datos",JOptionPane.ERROR_MESSAGE);
        } catch (SQLException ex) {
            System.err.println(ex.getMessage());
            JOptionPane.showMessageDialog(null,"Error al agregar cambios en la base de datos, comuniquese con los programadores para solucionar el problema.","Error al Conectarse a la base de Datos",JOptionPane.ERROR_MESSAGE);
        }
        return estado;
    }
    /**
     * Ejecuta un Procedimiento Almacenado.
     *
     * @param consulta la consulta del procedimiento almacenado cuyo valor de retorno del procedimiento almacenado será 1 si no hubo error, -1 si lo hubo.
     * @return true si el procedimiento se ejecutó sin problemas, false de lo contrario.
     */
    public static boolean EjecutarProcedimientoAlmacenado(String consulta){
        Connection con=null;
        Statement comando=null;
        boolean estado=false;
        try {
            con = GetConexion();
            comando = con.createStatement();
            try (ResultSet rs = comando.executeQuery(consulta)) {
                if(rs.next())
                    estado=(rs.getInt("estado")!=-1);
            }
            comando.close();
            con.close();
        } catch (ClassNotFoundException ex) {
            JOptionPane.showMessageDialog(null,"Error al crear la conexión con el gestor de base de datos, comuniquese con los programadores para solucionar el problema.","Error al Conectarse a la base de Datos",JOptionPane.ERROR_MESSAGE);
        } catch (SQLException ex) {
            JOptionPane.showMessageDialog(null,"Error al consultar al gestor de base de datos, comuniquese con los programadores para solucionar el problema.","Error al Conectarse a la base de Datos",JOptionPane.ERROR_MESSAGE);
        } 
        return estado;
    }
    public static void GuardarBitacora(String consulta){
        if(!Conexion.EjecutarConsulta(consulta)){
            try (PrintWriter escritor = new PrintWriter(new FileWriter("jaggsoft_backup.jagg",true),true)) {
                SimpleDateFormat formato=new SimpleDateFormat("dd/MM/yyyy '-' HH:mm:ss");
                escritor.write(formato.format(new java.util.Date())+" - "+consulta+"\r\n");
                escritor.close();
            }
            catch (FileNotFoundException ex) {System.err.println(ex.getMessage());} 
            catch (Exception ex) {System.err.println(ex.getMessage());}
        }
    }
    public static ArrayList<ConfiguracionUsuario> ObtenerConfiguraciones(File archivo){
        ArrayList<ConfiguracionUsuario> lista=null;
        try {
            ObjectInputStream lector=new ObjectInputStream(new FileInputStream(archivo));
            lista=(ArrayList<ConfiguracionUsuario>)lector.readObject();
        } catch (Exception ex) { System.err.println(ex.getMessage()); lista=null; }
        if(lista==null)
            lista=new ArrayList<ConfiguracionUsuario>();
        return lista;
    }
    public static ConfiguracionUsuario ObtenerConfiguracion(){
        try {
            File archivo=new File("configuracion.jagg");
            if(!archivo.exists())
                archivo.createNewFile();
            ArrayList<ConfiguracionUsuario> configuraciones=Conexion.ObtenerConfiguraciones(archivo);
            return Conexion.getConfiguracionUsuario(configuraciones);
        } catch (Exception ex) {System.err.println(ex.getMessage());}
        return null;
    }
    public static ConfiguracionUsuario getConfiguracionUsuario(ArrayList<ConfiguracionUsuario> lista){
        if(lista==null)
            return null;
        if(lista.isEmpty())
            return null;
        for(ConfiguracionUsuario c:lista){
            if(c.getIdUsuario().equals(Conexion.ID))
                return c;
        }
        return null;
    }
}